#include "my_process.h"

/*TODO：完成help功能*/
void help() {
    printf(
        "********************* Simple File DB Help *********************\n"
        "1. 数据库操作命令：\n"
        "-------------------------------------------------------------\n"
        "创建数据库:\n"
        "  create database 数据库名;\n"
        "    例: create database mydb;\n"
        "\n"
        "删除数据库:\n"
        "  drop database 数据库名;\n"
        "    例: drop database mydb;\n"
        "\n"
        "选择数据库:\n"
        "  use 数据库名;\n"
        "    例: use mydb;\n"
        "\n"
        "2. 数据表操作命令：\n"
        "-------------------------------------------------------------\n"
        "创建表:\n"
        "  create table 表名 (字段类型 字段名1, 字段类型 字段名2, ...);\n"
        "    字段类型只支持 int / float / string\n"
        "    例: create table user (string id, string name, float math);\n"
        "\n"
        "删除表:\n"
        "  drop table 表名;\n"
        "    例: drop table user;\n"
        "\n"
        "查看表结构:\n"
        "  info table 表名;\n"
        "    例: info table user;\n"
        "\n"
        "3. 数据记录操作命令：\n"
        "-------------------------------------------------------------\n"
        "插入记录:\n"
        "  insert into 表名 set 字段1=值1, 字段2=值2, ...;\n"
        "    例: insert into user set id='210001', name='liming', math=90;\n"
        "\n"
        "删除记录:\n"
        "  delete from 表名 [where 条件];\n"
        "    例: delete from user where id='210001';\n"
        "         delete from user where math<60;\n"
        "         delete from user;\n"
        "\n"
        "查询记录:\n"
        "  select 字段1,字段2,... from 表名 [where 条件] [order by 字段] [asc/desc];\n"
        "    例: select * from user;\n"
        "         select id,name from user where math<60;\n"
        "         select * from user where math<60 order by math desc;\n"
        "\n"
        "4. 其他说明：\n"
        "-------------------------------------------------------------\n"
        "- 所有命令必须以分号(;)结尾\n"
        "- 数据库支持不超过10张表，每张表不超过10个字段，1000条记录\n"
        "- 字符串类型字段的值须用单引号包围。如 name='lisi'\n"
        "- 仅支持简单 where 条件（字段=值、字段>值、字段<值等）\n"
        "- 支持 order by 关键字排序，asc为升序，desc为降序（默认升序）\n"
        "- 可输入 help; 或 ?; 显示本帮助提示\n"
        "\n"
        "*************************************************************\n"
    );
}


void run_db_process(bool &is_exit,bool &db_process,db* &current_db){
    string command_;
    getline(cin,command_);
    Command cmd =strtok_command(command_,DB_CMD);
    switch (cmd.type)
    {
    case CMD_CREATE:
        create_db(cmd.args);
        break;
    case CMD_DROP:
        drop_db(cmd.args);
        break;
    case CMD_USE: {
    db *tmp = use_db(cmd.args, db_process);
    if (tmp != NULL) current_db = tmp;
    break;
    }
    case CMD_EXIT:
        is_exit = true;
        break;
    case CMD_HELP:
        help();
        break;
    default:
        printf("Invalid command\n");
        break;
    }
}
/**
 * @brief 执行表处理命令
 * 
 * 该函数根据用户输入的命令执行相应的表处理操作。它首先读取用户输入的命令，
 * 然后根据命令类型执行相应的操作，如创建表、删除表、插入数据等。
 * 
 * @param db_process 引用类型，表示是否继续进行数据库处理，若为true则继续，否则停止
 * @param current_db 当前操作的数据库
 */
void run_table_process(bool &db_process,db *current_db){
    // 读取用户输入的命令
    string command_;
    getline(cin,command_);

    // 将用户输入的命令转换为Command对象
    Command  cmd =strtok_command(command_,TABLE_CMD);
    
    // 根据命令类型执行相应的操作
    switch (cmd.type)
    {
    case CMD_CREATE:
        // 执行创建表操作
        create_table(cmd.args,current_db);
        break;
    case CMD_DROP:
        // 执行删除表操作
        drop_table(cmd.args,current_db);
        break;
    case CMD_INSERT:
        // 执行插入数据操作
        insert_table(cmd.args,current_db);
        break;
    case CMD_SELECT:
        // 执行查询数据操作
        select_table(cmd.args,current_db);
        break;
    case CMD_INFO:
        // 执行获取表信息操作
        info_table(cmd.args,*current_db);
        break;
    case CMD_DELETE:
        // 执行删除数据操作
        delete_table(cmd.args,current_db);
        break;
    case CMD_EXIT:
        // 设置db_process为true，表示停止数据库处理操作
        db_process = true;
        break;
    case CMD_HELP:
        // 执行帮助操作，显示可用命令
        help();
        break;
    default:
        // 当命令类型无效时，输出错误信息
        printf("Invalid command\n");
        
    }
}
